# 时间 2024-9-18 22:58
# -*- coding: utf-8 -*-
from http.client import HTTPException

from flask import Flask,request,jsonify
from answer_search import AnswerSearcher
from question_classifier import QuestionClassifier
from question_parser import QuestionPaser
from gevent import pywsgi
from common.Result import Result




# 须知：
# 1.这里做了两个改造：searcher.search_main中返回的是一个字符串，里面还有可能想查找的东西
        # 原本这里返回的是一个数组
# 2.这里我还没有仔细看代码，但是这里返回的是一个数组，这里我就取一个

# 主要的功能都是从这个类来的
class ChatBotGraph:
    def __init__(self):
        self.classifier = QuestionClassifier()
        self.parser = QuestionPaser()
        self.searcher = AnswerSearcher()

    def chat_main(self, sent):
        answer = '没能理解您的问题，我数据量有限，仍在扩充中...'
        res_classify = self.classifier.classify(sent)

        # print('类别：',res_classify)
        res_sql = self.parser.parser_main(res_classify)
        # print('sql语句',res_sql)

        final_answers = self.searcher.search_main(res_sql)
        return final_answers

app = Flask(__name__)

# 网络请求相关
@app.route('/')
def hello_world():
    return 'Hello World'

# 构造聊天的结果,想着想java那样统一下返回结果
@app.route('/api/chat',methods=['POST'])
def chat():
    json=request.get_json()
    question=json['question']
    print(f'通过网络请求放过的问题：{question}')
    # TODO 就是这里还有一个可能要查找，这里看看咋放进来，这里先写个最基本的
    answer=handler.chat_main(question)
    print(f'这里是得到的答案:{answer}')

    return jsonify(Result.success(answer).to_dict())


# 这里搞了个全局异常处理，如果找不到答案时返回(有时候找不到问题时会报错问题)
 # 注册全局异常处理器
@app.errorhandler(Exception)
def handle_exception(e):
    # 区分 HTTP 异常和其他普通异常
    if isinstance(e, HTTPException):
        return jsonify(Result.error(f"HTTP错误: {e.description}").to_dict()), e.code
    else:
        # 返回自定义的错误信息，HTTP 状态码 500
        return jsonify(Result.error(f"服务器内部错误: {str(e)}").to_dict()), 500


if __name__ == '__main__':
    handler = ChatBotGraph()  # 提前进行初始化
    app.run(debug=True)